﻿using System;
using System.Collections.Generic;
//4.9扩展方法
//扩展方法允许一个现有类型扩展新的方法而不需要修改原始类型的定义。
//扩展方法是静态类的静态方法，其中第一个参数需要使用this修饰符，类型就是扩展的类型。

namespace _125_扩展方法
{
    public static class StringHelper
    {
        public static bool IsCapitalized(this string s)
        {
            if (string.IsNullOrEmpty(s)) return false;
            return char.IsUpper(s[0]);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            //虽然IsCapitalized扩展方法是字符串的实例方法，但是可以被调用，如下所示：
            Console.WriteLine("Perth".IsCapitalized());
            //在编译后，扩展方法调用会被转换回一个普通的静态方法调用：
            Console.WriteLine(StringHelper.IsCapitalized("Perth"));
            //这个转换过程如下：
            /*
            arg0.Method(arg1, arg2, ...); // 扩展方法调用
            StaticClass.Method(arg0, arg1, arg2, ...); // 静态方法调用
            */


            Console.WriteLine("Seattle".First()); // S

            //扩展方法是C# 3.0后增加的特性。
            Console.ReadKey();
        }
    }

    public static class FirstClass
    {
        //接口也一样可以扩展：
        public static T First<T>(this IEnumerable<T> sequence)
        {
            foreach (T element in sequence)
                return element;
            throw new InvalidOperationException("No elements!");
        }
    }
}
